# t.column :estado,             :string, :null => true
# t.column :nombre,             :string, :null => true, :limit => 128
# t.column :direccion,          :string, :null => true, :limit => 128
# t.column :cp,                 :string, :null => true, :limit => 20
# t.column :ciudad,             :string, :null => true, :limit => 128
# t.column :pais,               :string, :null => true, :limit => 128
# t.column :email,              :string, :null => true, :limit => 128
# t.column :notas,              :string, :null => true,  :limit => 512
# t.column :transporte_id,      :integer, :null => false
# t.column :transporte_precio,  :float, :null => false
# t.column :created_at,         :datetime
# t.column :updated_at,         :datetime

class Pedido < ActiveRecord::Base
  acts_as_historizable
  
  ENCARRITO   = 'en carrito'
  NUEVO       = 'nuevo'
  PAGADO      = 'pagado'
  ENVIADO     = 'enviado'
  RECIBIDO    = 'recibido'
  CANCELADO   = 'cancelado'
  
  has_many    :lineas,
              :class_name => 'PedidoLinea',
              :order => 'id ASC'
              
  belongs_to  :transporte
  
  before_destroy :delete_pedido_lineas
  
  
  def actualizar_transporte( transporte_id )
    transporte = Transporte.find_by_id( transporte_id )
    
    raise "Transporte id no encontrado: #{transporte_id}" unless not transporte.nil?
    
    self.transporte_id = transporte_id
    self.transporte_precio = transporte.precio
  end
  
  def anadir_linea( libro_id, cantidad = 1 )
    pedido_linea = PedidoLinea.new
    
    pedido_linea.libro_id         = libro_id
    pedido_linea.cantidad         = cantidad
    pedido_linea.pedido_id        = self.id
    pedido_linea.precio_unidad    = Libro.find_by_id( libro_id ).precio
    
    pedido_linea.save
  end
  
  def quitar_linea( libro_id )
    pedido_linea = self.linea_que_tiene_el_libro( libro_id )
    
    raise "Línea de pedido no encontrada en pedido_id: #{self.id} y libro_id: #{libro_id}" unless not pedido_linea.nil?
    
    pedido_linea.destroy
  end
  
  def linea_que_tiene_el_libro( libro_id )
    PedidoLinea.find_by_pedido_id_and_libro_id( self.id, libro_id )
  end
  
  def tiene_libro?( libro_id )
    # TODO: posible count_by_pedido_id_and_libro_id?
    PedidoLinea.count( :conditions => ["pedido_id = #{self.id} and libro_id = #{libro_id}"] ) > 0
  end
  
  def esta_vacio?
    # TODO: posible count_by_pedido_id?
    PedidoLinea.count( :conditions => ["pedido_id = #{self.id}"] ) == 0
  end
  
  def comprobar_datos_usuario
    errores = []
    
    errores << "Indica Nombre y Apellidos" if self.nombre.blank?
    errores << "El email no puede estar vacío" if self.email.blank?
    errores << "El email no parece correcto" if not self.email =~ /([\w-]+@([\w-]+\.)+[\w-]+)|(^$)/
    errores << "El email y la confirmación son diferentes" if self.email != self.email_confirmar
    errores << "Indica tu dirección completa" if self.direccion.blank?
    errores << "Indica tu ciudad" if self.ciudad.blank?
    errores << "Indica tu código postal" if self.cp.blank?
    errores << "El código postal deben ser 5 dígitos" if not self.cp =~ /^\d{5}$/
    errores << "Indica tu país" if self.pais.blank?
    
    # if not errores.empty?
    #   errores.each do |error|
    #     p error
    #   end
    # end
    
    errores
  end
  
  def num_libros
    num_libros = 0
    self.lineas.each do |linea|
      num_libros += linea.cantidad
    end
    num_libros
  end
  
  # ENCARRITO   = 'en carrito'
  # NUEVO       = 'nuevo'
  # PAGADO      = 'pagado'
  # ENVIADO     = 'enviado'
  # RECIBIDO    = 'recibido'
  # CANCELADO   = 'cancelado'
  def self.estados
    { 
      'Nuevo' => Pedido::NUEVO, 
      'Pagado' => Pedido::PAGADO, 
      'Enviado' => Pedido::ENVIADO,
      'Recibido' => Pedido::RECIBIDO,
      'Cancelado' => Pedido::CANCELADO
    }
  end
  
  protected
    def delete_pedido_lineas
      self.lineas.each do |linea|
        linea.destroy
      end
    end
end